# Контроллер лимитов

Лимиты позволяют ограничивать некоторый функционал в зависимости от выполнения определённых условий.

Кроме ограничений функционала, можно использовать лимиты для реализации некоторой логики в рамках конфигурационных файлов.

## Лимиты, зависящие от игрока

Все лимиты делятся на два типа:

- зависимые от игрока;
- неависимые от игрока.

Зависимые от игрока лимиты можно использовать только в тех местах, где условие применяется к игроку. Большинство мест применения лимитов в системе привилегий являются таковыми. На данный момент исключением является только файл `Modules.json`.

Независимые от игрока лимиты можно применять везде, где можно применять лимиты.

## Статические лимиты

Кроме зависимости от игрока лимиты так же делятся на статические и динамические. Внешне в конфигах они ничем друг от друга не отличаются, разница только в реализации и внутреннем устройстве.

Динамические лимиты в момент проверки вызывают соответствующую функцию в расширении, которая отвечает за эту самую проверку. Большая часть лимитов используют именно такой вариант, так как он является более универсальным.

Статические лимиты в момент проверки не вызывают никаких функций, вместо этого они сразу берут нужное значение, которое ранее установило расширение. Такие лимиты работают "быстрее", но, из-за специфичности их механизма, редко когда можно их реализовать.

## Структура обьекта лимита

_[Памятка по JSON](/readme/json.md)_

```jsonc
{
  "Limit": "<LimitType>",

  "<ParamKey>": "<ParamValue>"
}
```

Где:

- `<LimitType>` - название зарегистрированного лимита,
- `<ParamKey>` - название параметра,
- `<ParamValue>` - значение параметра.

Параметров может быть несколько, и у каждого лимита свой набор параметров, список которых можно найти в описании лимита.

### Пример Обьекта лимита

```jsonc
{
    "Limit": "Round",
    "Min": 2
}
```

Условие будет верно начиная со второго раунда.

## Создание новых лимитов

TODO: ...
